
import java.util.Iterator;
import java.util.List;

import ar.uba.fi.algo3.titiritero.ControladorJuego;

public class Juego {

	private Laberinto laberinto;
	private Pacman unPacman;
	private ControladorJuego controlador;
	private Interlocutor elInterlocutor;
	private List listaDeFantasmas;
	private long dificultad = 1;
	
	
	/**
	 * Constructor
	 * crea el laberinto, lo carga, crea el controlador, lo carga y deja el juego list para arrancar.
	 */
	public Juego(){
		
		// variables auxiliares
		Punto dimension;
		Celda unaCelda;
		Punto posicion = new Punto(0, 0);

		
				
		// Crear controlador y tablero
		this.controlador = new ControladorJuego();
		laberinto = LaberintoFactory.crearLaberinto(controlador);
		
		// Configurar el controlador
		controlador.setIntervaloSimulacion(dificultad);
		dimension = laberinto.getDimension();
		listaDeFantasmas = laberinto.getListaFantasmas();
		unPacman = laberinto.getPacman();
		
		//Crear y cargar el Interlocutor
		elInterlocutor = new Interlocutor();
		elInterlocutor.setUnLaberinto(laberinto);
		elInterlocutor.setUnPacman(unPacman);
		controlador.agregarKeyPressObservador(elInterlocutor);
		
		// Cargar celdas al controlador
		for (int i = 0; i < dimension.getX(); i++) {
			for (int j = 0; j < dimension.getY(); j++) {
				posicion.setX(i);
				posicion.setY(j);
				unaCelda = laberinto.getCelda(posicion);
				cargarVistaDeCelda(unaCelda);				
			}// J		
		}// I
		
		// Cargar fantasmas y pacman al controlador
		cargarVistaDePacman(unPacman);
		cargarVistaDeFantasmas(listaDeFantasmas);
	}
	
	
private void cargarVistaDePacman(Pacman elPacman) {

	VistaDePacman laVistaDelPacman = new VistaDePacman();
	laVistaDelPacman.setPosicionable(elPacman);
	controlador.agregarObjetoVivo(elPacman);
	}

//	public void interactuarConTeclado(){
//		
//		//TODO: Captar la direcci�n que eligi� el usuario, transformarla en el entero correspondiente y asignarsela a la variable direccion
//		int direccion = 0;
//		unPacman.mover(direccion, laberinto);		
//		
//	}

	private void cargarVistaDeFantasmas(List listaDeFantasmas) {

		// por ahora los fantasmas se ven todos iguales
		VistaDeBlinky unaVistaDeFantasma;
		
		for (Iterator iterator = listaDeFantasmas.iterator(); iterator
				.hasNext();) {
			Fantasma unFantasma = (Fantasma) iterator.next();
			unaVistaDeFantasma = new VistaDeBlinky();
			unaVistaDeFantasma.setPosicionable(unFantasma);
			
			/*									???????????
			 * Esta bien cargar a un controlador el dibujable y al objeto vivo que tiene el dibujable adentro,
			 * el cual ve como un objeto vivo? despues el controlador sabe mantener la relacion entre ambos?
			 */
			controlador.agregarObjetoVivo(unFantasma);
			controlador.agregarDibujable(unaVistaDeFantasma);
		}
		// TODO Auto-generated method stub
		
	}

	
	private void cargarVistaDeCelda(Celda unaCelda){
		
		VistaDePared unaVistaPared = null;
		VistaDePasillo unaVistaPasillo = null;
		boolean celdaAtravezable = false;
		
		celdaAtravezable = unaCelda.esAtravesable();
		if(celdaAtravezable){
			unaVistaPasillo = new VistaDePasillo();
			unaVistaPasillo.setPosicionable(unaCelda);
			controlador.agregarDibujable(unaVistaPasillo);
		}else{
			unaVistaPared = new VistaDePared();
			unaVistaPared.setPosicionable(unaCelda);
			controlador.agregarDibujable(unaVistaPared);
		}
	}


	
	public boolean finDeJuego(){
		if ( this.laberinto.getVidas() > 0 ) return false;
		else return true;
	}

	/**
	 * @return the controlador
	 */
	public ControladorJuego getControlador() {
		return controlador;
	}


	/**
	 * @param controlador the controlador to set
	 */
	public void setControlador(ControladorJuego controlador) {
		this.controlador = controlador;
	}

	/**
	 * @return the elInterlocutor
	 */
	public Interlocutor getElInterlocutor() {
		return elInterlocutor;
	}


	/**
	 * @param elInterlocutor the elInterlocutor to set
	 */
	public void setElInterlocutor(Interlocutor elInterlocutor) {
		this.elInterlocutor = elInterlocutor;
	}


}

